package offer;

import java.util.LinkedList;

/**
 * @author zhanb
 * @Auther ZhanBo
 * @Date 2020/5/18
 */
public class Solution58 {

    public static void main(String[] args) {
        //System.out.println(reverseLeftWords2("abcd",4));
        System.out.println(reverseWords("the sky is blue"));
    }

    /**
     * 剑指 Offer 58 - II
     * 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
     * 比如，输入字符串"abcdefg"和数字2，该函数将返回左旋转两位得到的结果"cdefgab"。
     *
     * 输入: s = "abcdefg", k = 2
     * 输出: "cdefgab"
     *
     * 输入: s = "lrloseumgh", k = 6
     * 输出: "umghlrlose"
     * @param s
     * @param n
     * @return
     */
    public static  String reverseLeftWords(String s, int n) {
        String result ="";
        if(n==0||s.length()==0){
            return s;
        }
        if(s.length()==n){
            for (int i=0; i<s.length(); i++) {
                result = s.charAt(i) + result;
            }
            return result;
        }
        String substring = s.substring(n,s.length());
        result = substring+s.substring(0,n);
        return result;
    }

    /**
     *剑指 Offer 58 - II
     * @param s
     * @param n
     * @return
     */
    public static String reverseLeftWords2(String s, int n) {
        StringBuilder res = new StringBuilder();
        for(int i = n; i < n + s.length(); i++) {
            res.append(s.charAt(i % s.length()));
        }
        return res.toString();
    }


    /**
     * 剑指 Offer 58 - I. 翻转单词顺序
     *
     * 输入一个英文句子，翻转句子中单词的顺序，但单词内字符的顺序不变。为简单起见，
     * 标点符号和普通字母一样处理。例如输入字符串"I am a student. "，则输出"student. a am I"。
     *
     *
     * 解题思路：
     * 双指针+切割函数
     * 输入: "the sky is blue"
     * 输出: "blue is sky the"
     * @param s
     * @return
     */
    public static String reverseWords(String s) {
        // 删除首尾空格
        s = s.trim();
        int j = s.length() - 1;
        int i = j;
        StringBuilder res = new StringBuilder();
        while(i >= 0) {
            while(i >= 0 && s.charAt(i) != ' ') {
                // 搜索首个空格
                i--;
            }
            // 添加单词
            res.append(s.substring(i + 1, j + 1) + " ");
            while(i >= 0 && s.charAt(i) == ' ') {
                // 跳过单词间空格
                i--;
            }
            // j 指向下个单词的尾字符
            j = i;
        }
        // 转化为字符串并返回
        return res.toString().trim();
    }
}
